package com.cs.beneficios.business.entity;


import com.cs.beneficios.business.model.SubprogramaSedeVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;

public class SubprogramaSedeDAO
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;
  
  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
  public SubprogramaSedeDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
  public Collection getSubprogramaSede(SubprogramaSedeVO criterea) throws SQLException
  {
    String query = "SELECT SUBSEDE.CODIGO CODE, TO_CHAR(SUBSEDE.DESDE,'DD/MM/YYYY') DESDE, "+
                   "TO_CHAR(SUBSEDE.HASTA,'DD/MM/YYYY') HASTA, "+
                   "SUBSEDE.NUMERO_BENEFICIO, SUBSEDE.NUMERO_BEN_DISPONIBLE, "+
                   "SEDE.CODIGO CODESEDE, SEDE.NOMBRE NOMBRESEDE, "+
                   "SUBPRO.CODIGO CODESUBPROGRAMA, SUBPRO.NOMBRE NOMBRESUBPROGRAMA, "+
                   "PRO.CODIGO CODEPROGRAMA, PRO.NOMBRE NOMBREPROGRAMA "+
                   "FROM TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, "+
                   "TCS_BEN_SEDE SEDE, "+
                   "TCS_BEN_SUBPROGRAMA SUBPRO, "+
                   "TCS_BEN_PROGRAMA PRO "+
                   "WHERE SEDE.CODIGO = SUBSEDE.SEDE_CODIGO "+
                   "AND SUBPRO.CODIGO = SUBSEDE.SBPR_CODIGO "+
                   "AND SUBPRO.PRG_CODIGO =  PRO.CODIGO ";
    
    
    
    if((Object)criterea.getCodeSede() != null)
    {
      query += " AND SEDE.CODIGO = "+criterea.getCodeSede();
    }
    if((Object)criterea.getCodeSubprograma() != null)
    {
      query += " AND SUBPRO.CODIGO = "+criterea.getCodeSubprograma();
    }
    if((Object)criterea.getCodePrograma() != null)
    {
      query += " AND PRO.CODIGO = "+criterea.getCodePrograma();
    }
   
    
    query += " ORDER BY PRO.NOMBRE,SUBPRO.NOMBRE,DESDE DESC, SEDE.NOMBRE ";
    ResultSet rst = null;
    ArrayList lsubsede = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    SubprogramaSedeVO subsedeVO = null;
		while ( rst.next() ) 
		{
        subsedeVO =  new SubprogramaSedeVO();
        subsedeVO.setCode(new Long(rst.getLong("CODE")));
        subsedeVO.setCodeSede(new Long (rst.getLong("CODESEDE")));
        subsedeVO.setNombreSede(rst.getString("NOMBRESEDE"));
        subsedeVO.setCodePrograma(new Long(rst.getLong("CODEPROGRAMA")));
        subsedeVO.setNombrePrograma(rst.getString("NOMBREPROGRAMA"));
        subsedeVO.setCodeSubprograma(new Long (rst.getLong("CODESUBPROGRAMA")));
        subsedeVO.setNombreSubprograma(rst.getString("NOMBRESUBPROGRAMA"));
        subsedeVO.setDesde(rst.getString("DESDE"));
        subsedeVO.setHasta(rst.getString("HASTA"));
        subsedeVO.setCantidadTotal(rst.getString("NUMERO_BENEFICIO"));
        subsedeVO.setCantidadDisponible(rst.getString("NUMERO_BEN_DISPONIBLE"));
        lsubsede.add(subsedeVO);
        subsedeVO=null;
		}
  	rst.close();
    return lsubsede;
  }
  
  public Collection getSubproSede(String codesubprosede) throws SQLException
  {
    int iCodeSubproSede = Integer.parseInt(codesubprosede);
    String query = "SELECT SUBSEDE.CODIGO CODE, TO_CHAR(SUBSEDE.DESDE,'DD/MM/YYYY') DESDE, "+
                   "TO_CHAR(SUBSEDE.HASTA,'DD/MM/YYYY') HASTA, "+
                   "SUBSEDE.NUMERO_BENEFICIO, SUBSEDE.NUMERO_BEN_DISPONIBLE, "+
                   "SEDE.CODIGO CODESEDE, SEDE.NOMBRE NOMBRESEDE, "+
                   "SUBPRO.CODIGO CODESUBPROGRAMA, SUBPRO.NOMBRE NOMBRESUBPROGRAMA, "+
                   "PRO.CODIGO CODEPROGRAMA, PRO.NOMBRE NOMBREPROGRAMA "+
                   "FROM TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, "+
                   "TCS_BEN_SEDE SEDE, "+
                   "TCS_BEN_SUBPROGRAMA SUBPRO, "+
                   "TCS_BEN_PROGRAMA PRO "+
                   "WHERE SEDE.CODIGO = SUBSEDE.SEDE_CODIGO "+
                   "AND SUBPRO.CODIGO = SUBSEDE.SBPR_CODIGO "+
                   "AND SUBPRO.PRG_CODIGO =  PRO.CODIGO "+
                   "AND SUBSEDE.CODIGO="+iCodeSubproSede+" ";
  
    query += " ORDER BY PRO.NOMBRE,SUBPRO.NOMBRE,DESDE DESC, SEDE.NOMBRE ";
    ResultSet rst = null;
    ArrayList lsubsede = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    SubprogramaSedeVO subsedeVO = null;
		while ( rst.next() ) 
		{
        subsedeVO =  new SubprogramaSedeVO();
        subsedeVO.setCode(new Long(rst.getLong("CODE")));
        subsedeVO.setCodeSede(new Long (rst.getLong("CODESEDE")));
        subsedeVO.setNombreSede(rst.getString("NOMBRESEDE"));
        subsedeVO.setCodePrograma(new Long(rst.getLong("CODEPROGRAMA")));
        subsedeVO.setNombrePrograma(rst.getString("NOMBREPROGRAMA"));
        subsedeVO.setCodeSubprograma(new Long (rst.getLong("CODESUBPROGRAMA")));
        subsedeVO.setNombreSubprograma(rst.getString("NOMBRESUBPROGRAMA"));
        subsedeVO.setDesde(rst.getString("DESDE"));
        subsedeVO.setHasta(rst.getString("HASTA"));
        subsedeVO.setCantidadTotal(rst.getString("NUMERO_BENEFICIO"));
        subsedeVO.setCantidadDisponible(rst.getString("NUMERO_BEN_DISPONIBLE"));
        lsubsede.add(subsedeVO);
        subsedeVO=null;
		}
  	rst.close();
    return lsubsede;
  }
  
  
  public void insertUsuarioSede(Long codeSubprogramaSede, Long codeUser, String param[]) throws SQLException
  {
    String query = "select codigo from TCS_BEN_USUARIO_SEDE "+
                   "where usu_codigo = "+codeUser+" and spse_codigo = "+codeSubprogramaSede;
    ResultSet rst = null;
    rst = cf.getRecordsRset(query,null,conn);
    if(!rst.next())
    {
      query = "INSERT INTO TCS_BEN_USUARIO_SEDE "+
              "(CODIGO, USU_CODIGO, SPSE_CODIGO, "+
              " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "+
              "VALUES (SCS_BEN_USE.nextval,"+codeUser+","+codeSubprogramaSede+",?,to_date(?,'dd/mm/yyyy'),?,?,to_date(?,'dd/mm/yyyy'),?)";
      int iRegInsert = cf.execSql(query, param, conn);
    }
  }
  
  
  
  
  
  public String[] insertSubprogramaSede(Long codeSede, Long codeSubprograma,
                                   String desde, String hasta, String cantidad, String param[]) throws SQLException
 {
   String retorno[] = new String[2];
   retorno[0] = "false";
   int validate1 = validateExist(codeSede,codeSubprograma,desde,hasta);
   if(validate1 == 0)
   {
      if(validateExist(codeSede,codeSubprograma))
      {
        String validate[] = validateDates(codeSede,codeSubprograma,desde);
          if(validate[0].equals("true"))
          {
            String query = "INSERT INTO TCS_BEN_SUBPROGRAMA_SEDE "+
                           "(CODIGO, SEDE_CODIGO, SBPR_CODIGO, "+
                           "DESDE, HASTA, NUMERO_BENEFICIO, "+
                           "NUMERO_BEN_DISPONIBLE, "+
                           " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "+
                           "VALUES (SCS_BEN_SPSE.nextval,?,?,"+
                           "to_date(?,'yyyy/mm/dd'),to_date(?,'yyyy/mm/dd'),?,?,?,to_date(?,'dd/mm/yyyy'),?,?,to_date(?,'dd/mm/yyyy'),?)";
            String strArr[] = {codeSede.toString(),codeSubprograma.toString(),desde,hasta,cantidad,cantidad,
                              param[0],param[1],param[2],param[3],param[4],param[5]};
            int iRegInsert = cf.execSql(query,strArr,conn);
            if(iRegInsert > 0)
            {
              retorno[0] = "true";
              query = "select max(codigo) codigo from TCS_BEN_SUBPROGRAMA_SEDE";
              ResultSet rst = cf.getRecordsRset(query,null,conn);
              if(rst.next())
              {
                retorno[1]=rst.getString("codigo");
              }
            }else
            {
              retorno[0] = "false";
            } 
          }else{
            if((Object)validate[1] != null)
            {
              retorno[0] = "ususede"; // indica que solo se debe insertar 
              retorno[1] = validate[1]; 
            }else
            {
              retorno[1] = "Ese beneficio ya esta cubierto en ese periodo de tiempo, seleccione otro rango!";
            }
          }
      }else
      {
            String query = "INSERT INTO TCS_BEN_SUBPROGRAMA_SEDE "+
                           "(CODIGO, SEDE_CODIGO, SBPR_CODIGO, "+
                           "DESDE, HASTA, NUMERO_BENEFICIO, "+
                           "NUMERO_BEN_DISPONIBLE, "+
                           " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "+
                           "VALUES (SCS_BEN_SPSE.nextval,?,?,"+
                           "to_date(?,'yyyy/mm/dd'),to_date(?,'yyyy/mm/dd'),?,?,?,to_date(?,'dd/mm/yyyy'),?,?,to_date(?,'dd/mm/yyyy'),?)";
            String strArr[] = {codeSede.toString(),codeSubprograma.toString(),desde,hasta,cantidad,cantidad,
                              param[0],param[1],param[2],param[3],param[4],param[5]};
            int iRegInsert = cf.execSql(query,strArr,conn);
            if(iRegInsert > 0)
            {
              retorno[0] = "true";
              query = "select max(codigo) codigo from TCS_BEN_SUBPROGRAMA_SEDE";
              ResultSet rst = cf.getRecordsRset(query,null,conn);
              if(rst.next())
              {
                retorno[1]=rst.getString("codigo");
              }
            }else
            {
              retorno[0] = "false";
            } 
      }
   }else{
      retorno[0] = "ususede";//"La sede seleccionada ya tiene asignado ese beneficio en el mismo periodo de tiempo";
      retorno[1] = validate1+"";
   }
   return retorno;
 }
  
  
 public int validateExist(Long codeSede, Long codeSubprograma, String desde, String hasta) throws SQLException
 {
   String query = "select codigo from TCS_BEN_SUBPROGRAMA_SEDE "+
                  "where sede_codigo = "+ codeSede+
                  " and sbpr_codigo = "+codeSubprograma+
                  " and desde = to_date('"+desde+"','yyyy/mm/dd')"+
                  " and hasta = to_date('"+hasta+"','yyyy/mm/dd')";
   ResultSet rst = cf.getRecordsRset(query,null,conn);
   if(rst.next())
   {
      return rst.getInt("codigo");
   }
   else
   {
      return 0;
   }
 }
 
 public boolean validateExist(Long codeSede, Long codeSubprograma) throws SQLException
 {
   String query = "select codigo from TCS_BEN_SUBPROGRAMA_SEDE "+
                  "where sede_codigo = "+ codeSede+
                  " and sbpr_codigo = "+codeSubprograma;
   ResultSet rst = cf.getRecordsRset(query,null,conn);
   if(rst.next())
   {
      rst.close();
      return true;
   }
   else
   {
      rst.close();
      return false;
   }
 }

 public String[] validateDates(Long codeSede, Long codeSubprograma, String desde) throws SQLException
 {
   String query = "select case when hasta < to_date('"+desde+"','yyyy/mm/dd') then 'true' "+
                         "else 'false' "+
                         "end validacion, codigo "+
                  "from tcs_ben_subprograma_sede "+
                  "where codigo =  (select max(codigo) from tcs_ben_subprograma_sede "+
                                    "where sbpr_codigo = "+codeSubprograma+
                                    " and sede_codigo = "+codeSede+")";
   ResultSet rst = cf.getRecordsRset(query,null,conn);
   String retorno[] =  new String[2];
   if(rst.next())
   {
     String test = rst.getString("validacion");
     retorno[0] = test;
     retorno[1] =  rst.getString("codigo");
     rst.close();
   }else{
     retorno[0] = "false";
     rst.close();
   }
   return retorno;
 }
 
  public boolean actualizarSubproSede(String codebenesede, String parArr[]) throws SQLException
  {
    int code = Integer.parseInt(codebenesede.trim());
    String query = "UPDATE TCS_BEN_SUBPROGRAMA_SEDE SET "+
                   "SEDE_CODIGO = ?, "+
                   "DESDE = to_date(?,'yyyy/mm/dd'), "+
                   "HASTA = to_date(?,'yyyy/mm/dd'), "+
                   "NUMERO_BENEFICIO = NUMERO_BENEFICIO + ?, "+
                   "NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + ?, "+
                   "usuario_modifica = ?,"+
                   "fecha_modifica = to_date(?,'dd/mm/yyyy'), "+
                   "terminal_modifica = ? "+
                   "WHERE CODIGO = "+code;
    int i = cf.execSql(query,parArr,conn);
    if(i > 0)
      return true;
    else
      return false;
 }
 
 public Connection getConn()
 {
    return conn;
 }
}